/*
 * FaceCat图形通讯框架
 * 著作权编号:2015SR229355+2020SR0266727
 * 上海卷卷猫信息技术有限公司
 */

#ifdef __FCCHART_H__
#else
#define __FCCHART_H__
#endif

#pragma once
#include "stdafx.h"
#include "FCPaint.h"
#include "FCView.h"
#include "SecurityData.h"
#include "FCPlot.h"
#include "BaseShape.h"

namespace FaceCat{
    /**
     * 图表视图
     */
    class FCChart : public FCView{
    public:
        FCChart();
        virtual ~FCChart();
    public:
        bool m_autoFillHScale; //是否填充满X轴
        bool m_allowDragChartDiv; //是否允许拖拽图层
        int m_candleDistance; //蜡烛线的距离
        double m_candleMax; //蜡烛线的最大值
        double m_candleMin; //蜡烛线的最小值
        double m_candleMaxRight; //蜡烛线的右轴最大值
        double m_candleMinRight; //蜡烛线的右轴最小值
        Long m_crossTipColor; //十字线标识的颜色
        Long m_crossLineColor; //十字线的颜色
        int m_candlePaddingTop; //图表层的上边距
        int m_candlePaddingBottom; //图表层的下边距
        int m_candleDigit; //图表层保留小数的位数
        double m_candleDivPercent; //图表层的占比
        int m_crossStopIndex; //鼠标停留位置
        String m_cycle; //周期
        ArrayList<SecurityData> m_data; //子节点
        Long m_downColor; //下跌颜色
        int m_firstVisibleIndex; //起始可见的索引
        Long m_gridColor; //网格颜色
        int m_lastVisibleIndex; //结束可见的索引
        int m_leftVScaleWidth; //左轴宽度
        bool m_lastRecordIsVisible; //最后记录是否可见
        double m_lastVisibleKey; //最后可见的主键
        double m_hScalePixel; //蜡烛线的宽度
        int m_hScaleHeight; //X轴的高度
        int m_hScaleTextDistance; //X轴的文字间隔
        String m_hScaleFormat; //X轴的格式化字符，例如YYYY-mm-dd HH:MM:SS
        double m_indMax; //指标层的最大值
        double m_indMin; //指标的最小值
        double m_indMax2; //指标层2的最大值
        double m_indMin2; //指标层2的最小值
        double m_indMaxRight; //指标层的右轴最大值
        double m_indMinRight; //指标层的右轴最小值
        double m_indMax2Right; //指标层2的右轴最大值
        double m_indMin2Right; //指标层2的右轴最小值
        int m_indDigit; //指标层保留小数的位数
        int m_indDigit2; //指标层2保留小数的位数
        double m_indDivPercent; //指标层的占比
        double m_indDivPercent2; //指标层2的占比
        int m_indPaddingTop; //指标层的上边距
        int m_indPaddingBottom; //指标层的下边距
        int m_indPaddingTop2; //指标层2的上边距
        int m_indPaddingBottom2; //指标层2的下边距
        ArrayList<Long> m_indicatorColors; //扩展图形
        int m_lastValidIndex; //最后有效数据索引
        float m_lineWidthChart;
        String m_mainIndicator; //主图指标
        int m_magnitude; //成交量的比例
        Long m_midColor; //中间色
        float m_offsetX; //横向绘图偏移
        ArrayList<FCPlot*> m_plots; //画线
        int m_plotPointSizeChart; //画线的选中点大小
        int m_rightVScaleWidth; //右轴宽度
        int m_rightSpace; //右侧空间
        Long m_scaleColor; //刻度的颜色
        String m_showIndicator; //显示指标
        bool m_showCrossLine; //是否显示十字线
        int m_selectPlotPoint; //选中画线的点
        bool m_startMovePlot; //选中画线
        String m_selectShape; //选中的图形
        String m_selectShapeEx ; //选中的图形信息
        ArrayList<BaseShape*> m_shapes; //扩展图形
        FCPlot *m_sPlot; //选中的线条
        float m_targetOldX; //缩小时旧的位置1
        float m_targetOldX2; //放大时旧的位置2
        FCPoint m_touchPosition; //鼠标坐标
        double m_volMax; //成交量层的最大值
        double m_volMin; //成交量层的最小值
        double m_volMaxRight; //成交量层的右轴最大值
        double m_volMinRight; //成交量层的右轴最小值
        int m_volDigit; //成交量层保留小数的位数
        double m_volDivPercent; //成交量层的占比
        int m_volPaddingTop; //成交量层的上边距
        int m_volPaddingBottom; //成交量层的下边距
        int m_vScaleDistance; //纵轴的间隔
        String m_vScaleType; //纵轴的类型 log10代表指数坐标
        Long m_upColor; //上涨颜色
        double m_kChart;
        double m_bChart;
        double m_oXChart;
        double m_oYChart;
        double m_rChart;
        double m_gridStepChart; //网格计算临时变量
        int m_gridDigitChart; //网格计算临时变量
        int m_firstIndexCacheChart;
        int m_firstTouchIndexCacheChart;
        FCPoint m_firstTouchPointCacheChart;
        int m_lastIndexCacheChart;
        int m_secondTouchIndexCacheChart;
        FCPoint m_secondTouchPointCacheChart;
        int m_firstPaddingTop;
        int m_firtstPaddingBottom;
        FCPoint m_touchDownPointChart;
        String m_addingPlotChart;
        double m_x4Chart;
        double m_y4Chart;
        double m_nHighChart;
        double m_nLowChart;
        double m_xChart;
        double m_yChart;
        double m_wChart;
        double m_hChart;
        double m_upSubValue;
        double m_downSubValue;
        String m_candleStyle;
        String m_barStyle;
        double m_firstOpen;
        ArrayList<double> m_allema12;
        ArrayList<double> m_allema26;
        ArrayList<double> m_alldifarr;
        ArrayList<double> m_alldeaarr;
        ArrayList<double> m_allmacdarr;
        ArrayList<double> m_bollUp;
        ArrayList<double> m_bollDown;
        ArrayList<double> m_bollMid;
        ArrayList<double> m_bias1;
        ArrayList<double> m_bias2;
        ArrayList<double> m_bias3;
        ArrayList<double> m_kdjK;
        ArrayList<double> m_kdjD;
        ArrayList<double> m_kdjJ;
        ArrayList<double> m_rsi1;
        ArrayList<double> m_rsi2;
        ArrayList<double> m_rsi3;
        ArrayList<double> m_roc;
        ArrayList<double> m_rocMa;
        ArrayList<double> m_wr1;
        ArrayList<double> m_wr2;
        ArrayList<double> m_cci;
        ArrayList<double> m_bbi;
        ArrayList<double> m_trix;
        ArrayList<double> m_trixMa;
        ArrayList<double> m_dma1;
        ArrayList<double> m_dma2;
        ArrayList<double> m_ma5;
        ArrayList<double> m_ma10;
        ArrayList<double> m_ma20;
        ArrayList<double> m_ma30;
        ArrayList<double> m_ma120;
        ArrayList<double> m_ma250;
        ArrayList<double> m_closeArr;
    public:
        /**
         * 添加画线
         * @params firstTouch 是否第一次触摸
         * @params firstPoint 第一次触摸的坐标
         * @params secondTouch 是否第二次触摸
         * @params secondPoint 第二次触摸的坐标
         */
        virtual void addPlotDefault(bool firstTouch, const FCPoint& firstPoint, bool secondTouch, const FCPoint& secondPoint, const String& darkOrLight);
        /**
         * 计算平均值
         * @params list 集合
         */
        virtual double avgValue(ArrayList<double> *list);
        /**
         * 计算坐标轴
         * @params min 最小值
         * @params max 最大值
         * @params yLen 长度
         * @params maxSpan 最大间隔
         * @params minSpan 最小间隔
         * @params defCount 数量
         */
        virtual double chartGridScale(double min, double max, int yLen, double maxSpan, double minSpan, int defCount);
        /**
         * 计算最大最小值
         */
        virtual void calculateChartMaxMin();
        /**
         * 检查最后可见索引
         */
        virtual void checkChartLastVisibleIndex();
        /**
         * 清除缓存数据方法
         */
        virtual void clearDataArr();
        /**
         * 获取数据
         */
        virtual void calcChartIndicator();
        /**
         * 绘制线条
         * @params paint 绘图对象
         * @params clipRect 裁剪区域
         * @params divIndex 图层
         * @params datas 数据
         * @params color 颜色
         * @params selected 是否选中
         */
        virtual void drawChartLines(FCPaint *paint, const FCRect& clipRect, int divIndex, ArrayList<double> *datas, Long color, bool selected);
        /**
         * 绘制线条到右轴
         * @params paint 绘图对象
         * @params clipRect 裁剪区域
         * @params divIndex 图层
         * @params datas 数据
         * @params color 颜色
         * @params selected 是否选中
         */
        virtual void drawChartLinesInRight(FCPaint* paint, const FCRect& clipRect, int divIndex, ArrayList<double>* datas, Long color, bool selected);
        /**
         * 绘制画线工具
         * @params paint 绘图对象
         * @params clipRect 裁剪区
         */
        virtual void drawChartPlot(FCPaint *paint, const FCRect& clipRect);
        /**
         * 绘制图表
         * @params paint 绘图对象
         * @params clipRect 裁剪区
         */
        virtual void drawChartStock(FCPaint *paint, const FCRect& clipRect);
        /**
         * 绘制十字线
         * @params paint 绘图对象
         * @params clipRect 裁剪区
         */
        virtual void drawChartCrossLine(FCPaint *paint, const FCRect& clipRect);
        /**
         * 绘制刻度
         * @params paint 绘图对象
         * @params clipRect 裁剪区
         */
        virtual void drawChartScale(FCPaint *paint, const FCRect& clipRect);
        /**
         * 根据三点计算圆心
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         * @params x3 横坐标3
         * @params y3 纵坐标3
         */
        virtual void ellipseOR(double x1, double y1, double x2, double y2, double x3, double y3);
        /**
         * 判断点是否在椭圆上
         * @params x 横坐标
         * @params y 纵坐标
         * @params oX 坐标起始X
         * @params oY 坐标起始Y
         * @params a 椭圆参数a
         * @params b 椭圆参数b
         */
        virtual bool ellipseHasPoint(double x, double y, double oX, double oY, double a, double b);
        /**
         * 计算斐波那契数列
         * @params index 索引
         */
        virtual int fibonacciValue(int index);
        /**
         * 获取视图类型
         */
        virtual String getViewType();
        /**
         * 获取图表的区域
         * @params plot 画线
         */
        virtual void getCandleRange(FCPlot *plot);
        /**
         * 计算EMA
         * @params n 周期
         * @params value 当前数据
         * @params lastEMA 上期数据
         */
        virtual double getEMA(int n, double value, double lastEMA);
        /**
         * 计算MACD
         * @params dif DIF数据
         * @params dea DEA数据
         */
        virtual ArrayList<double> getMACD(ArrayList<double>* dif, ArrayList<double>* dea);
        /**
         * 计算DIF
         * @params close12 12日数据
         * @params close26 26日数据
         */
        virtual ArrayList<double> getDIF(ArrayList<double>* close12, ArrayList<double>* close26);
        /**
         * 根据日期获取索引
         * @params date 日期
         */
        virtual int getChartIndexByDate(double date);
        /**
         * 获取百分比线的刻度
         * @params y1 纵坐标1
         * @params y2 纵坐标2
         */
        virtual ArrayList<int> getPercentParams(double y1, double y2);
        /**
         * 获取TRIX的数据
         */
        virtual void getTRIXData(ArrayList<double> *ticks, int m, ArrayList<double> *trixArr, ArrayList<double> *matrixArr);
        /**
         * 计算boll指标
         */
        virtual void getBollData(ArrayList<double> *ticks, int maDays, ArrayList<double> *ups, ArrayList<double> *mas, ArrayList<double> *lows);
        /**
         * 计算kdj指标
         */
        virtual void getKDJData(ArrayList<double> *highArr, ArrayList<double> *lowArr, ArrayList<double> *closeArr, int n, int m1, int m2, ArrayList<double> *ks, ArrayList<double> *ds, ArrayList<double> *js);
        /**
         * 计算rsi指标
         */
        virtual void getRSIData(ArrayList<double> *ticks, int n1, int n2, int n3, ArrayList<double> *rsi1, ArrayList<double> *rsi2, ArrayList<double> *rsi3);
        /**
         * 计算ROC数据
         */
        virtual void getRocData(ArrayList<double> *ticks, int n, int m, ArrayList<double> *roc, ArrayList<double> *maroc);
        /**
         * 获取BIAS的数据
         */
        virtual void getBIASData(ArrayList<double> *ticks, int n1, int n2, int n3, ArrayList<double> *bias1Arr, ArrayList<double> *bias2Arr, ArrayList<double> *bias3Arr);
        /**
         * 计算DMA（平均差）
         */
        virtual void getDMAData(ArrayList<double> *ticks, int n1, int n2, ArrayList<double> *difArr, ArrayList<double> *difmaArr);
        /**
         * 计算BBI(多空指标)
         */
        virtual void getBBIData(ArrayList<double> *ticks, int n1, int n2, int n3, int n4, ArrayList<double> *bbiArr);
        /**
         * 计算WR(威廉指标)
         */
        virtual void getWRData(ArrayList<double> *highArr, ArrayList<double> *lowArr, ArrayList<double> *closeArr, int n1, int n2, ArrayList<double> *wr1Arr, ArrayList<double> *wr2Arr);
        /**
         * CCI(顺势指标)计算  CCI（N日）=（TP－MA）÷MD÷0.015
         */
        virtual void getCCIData(ArrayList<double> *highArr, ArrayList<double> *lowArr, ArrayList<double> *closeArr, int n, ArrayList<double> *cciArr);
        /**
         * 根据索引获取横坐标
         * @params index 索引
         */
        virtual int getChartX(int index);
        /**
         * 获取最大显示记录条数
         * @params hScalePixel 间隔
         * @params pureH 横向距离
         */
        virtual int getChartMaxVisibleCount(double hScalePixel, double pureH);
        /**
         * 获取图表层的高度
         */
        virtual int getCandleDivHeight();
        /**
         * 获取成交量层的高度
         */
        virtual int getVolDivHeight();
        /**
         * 获取指标层的高度
         */
        virtual int getIndDivHeight();
        /**
         * 获取指标层2的高度
         */
        virtual int getIndDivHeight2();
        /**
         * 获取横向工作区
         */
        virtual int getChartWorkAreaWidth();
        /**
         * 计算线性回归上下限
         * @params plot 画线
         * @params a 直线a
         * @params b 直线b
         */
        virtual void getLRBandRange(FCPlot *plot, double a, double b);
        /**
         * 计算数值在层中的位置
         * @params divIndex 所在层
         * @params value 数值
         */
        virtual int getChartY(int divIndex, double value);
        /**
         * 根据位置计算索引
         * @params mp 坐标
         */
        virtual int getChartIndex(const FCPoint& mp);
        /**
         * 根据索引获取日期
         * @params index 坐标
         */
        virtual double getChartDateByIndex(int index);
        /**
         * 根据坐标获取对应的值
         * @params point 坐标
         */
        virtual double getChartValue(const FCPoint& point);
        /**
         * 计算数值在层中的右轴位置
         * @params divIndex 所在层
         * @params value 数值
         */
        virtual int getChartYInRight(int divIndex, double value);
        /**
         * 根据坐标获取对应的值
         * @params point 坐标
         */
        virtual double getCandleDivValue(const FCPoint& point);
        /**
         * 计算最大值
         * @params ticks 最高价数组
         * @params days 周期
         */
        virtual ArrayList<double> hhvValue(ArrayList<double> *ticks, int days);
        /**
         * 判断是否选中图形
         * @params mp 坐标
         */
        virtual void judgeSelectShape(const FCPoint& mp);
        /**
         * 图表的键盘按下事件
         * @params key 按键
         */
        virtual void keyDownChart(char key);
        /**
         * 计算直线参数
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         * @params x3 横坐标3
         * @params y3 纵坐标3
         */
        virtual void lineXY(double x1, double y1, double x2, double y2, double oX, double oY);
        /**
         * 计算线性回归
         * @params list 集合
         */
        virtual double linearRegressionEquation(ArrayList<double> *list);
        /**
         * 计算最小值
         * @params ticks 最高价数组
         * @params days 周期
         */
        virtual ArrayList<double> llvValue(ArrayList<double> *ticks, int days);
        /**
         * 计算最大值
         * @params list 集合
         */
        virtual double maxValue(ArrayList<double> *list);
        /**
         * 计算最小值
         * @params list 集合
         */
        virtual double minValue(ArrayList<double> *list);
        /**
         * MA数据计算
         * @params ticks 最高价数组
         * @params days 周期
         */
        virtual ArrayList<double> maValue(ArrayList<double> *ticks, int days);
        /**
         * 绘图方法
         * @params paint 绘图对象
         * @params clipRect 裁剪区
         */
        virtual void onPaint(FCPaint *paint, const FCRect& clipRect);
        /**
         * 触摸按下方法
         * @params touchInfo 触摸信息
         */
        virtual void onTouchDown(FCTouchInfo touchInfo);
        /**
         * 触摸移动方法
         * @params touchInfo 触摸信息
         */
        virtual void onTouchMove(FCTouchInfo touchInfo);
        /**
         * 触摸抬起方法
         * @params touchInfo 触摸信息
         */
        virtual void onTouchUp(FCTouchInfo touchInfo);
        /**
         * 触摸滚动方法
         * @params touchInfo 触摸信息
         */
        virtual void onTouchWheel(FCTouchInfo touchInfo);
        /**
         * 键盘按下方法
         * @params key 按键
         */
        virtual void onKeyDown(char key);
        /**
         * 计算平行四边形参数
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         * @params x3 横坐标3
         * @params y3 纵坐标3
         */
        virtual void parallelogram(double x1, double y1, double x2, double y2, double x3, double y3);
        /**
         * 根据坐标计算矩形
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         */
        virtual void rectangleXYWH(double x1, double y1, double x2, double y2);
        /**
         * 自动设置首先可见和最后可见的记录号
         */
        virtual void resetChartVisibleRecord();
        /**
         * REF函数
         * @params ticks 数据
         * @params days 日期
         */
        virtual ArrayList<double> refValue(ArrayList<double> *ticks, int days);
        /**
         * 左滚
         * @params step 步长
         */
        virtual void scrollLeftChart(int step);
        /**
         * 右滚
         * @params step 步长
         */
        virtual void scrollRightChart(int step);
        /**
         * 判断是否选中直线
         * @params mp 坐标
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         */
        virtual bool selectLine(const FCPoint& mp, double x1, double y1, double x2, double y2);
        /**
         * 判断是否选中射线
         * @params mp 坐标
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         */
        virtual bool selectRay(const FCPoint& mp, double x1, double y1, double x2, double y2);
        /**
         * 判断是否选中线段
         * @params mp 坐标
         * @params x1 横坐标1
         * @params y1 纵坐标1
         * @params x2 横坐标2
         * @params y2 纵坐标2
         */
        virtual bool selectSegment(const FCPoint& mp, double x1, double y1, double x2, double y2);
        /**
         * 获取方差数据
         */
        virtual double standardDeviationSum(ArrayList<double> *listValue, double avgValue);
        /**
         * 选中画线
         * @params mp 坐标
         */
        virtual FCPlot* selectPlot(const FCPoint& mp);
        /**
         * 设置可见索引
         * @params firstVisibleIndex 起始索引
         * @params lastVisibleIndex 结束索引
         */
        virtual void setChartVisibleIndex(int firstVisibleIndex, int lastVisibleIndex);
        /**
         * 判断是否选中线条
         * @params mp 坐标
         * @params divIndex 层索引
         * @params datas 数据
         * @params curIndex 当前索引
         */
        virtual bool selectLines(const FCPoint& mp, int divIndex, ArrayList<double> *datas, int curIndex);
        /**
         * 判断是否在右轴选中线条
         * @params mp 坐标
         * @params divIndex 层索引
         * @params datas 数据
         * @params curIndex 当前索引
         */
        virtual bool selectLinesInRight(const FCPoint& mp, int divIndex, ArrayList<double> *datas, int curIndex);
        /**
         * 图表的鼠标按下方法
         * @params firstTouch 是否第一次触摸
         * @params firstPoint 第一次触摸的坐标
         * @params secondTouch 是否第二次触摸
         * @params secondPoint 第二次触摸的坐标
         */
        virtual void touchDownChart(bool firstTouch, const FCPoint& firstPoint, bool secondTouch, const FCPoint& secondPoint, int clicks);
        /**
         * 图表的鼠标移动方法
         * @params firstTouch 是否第一次触摸
         * @params firstPoint 第一次触摸的坐标
         * @params secondTouch 是否第二次触摸
         * @params secondPoint 第二次触摸的坐标
         */
        virtual void touchMoveChart(bool firstTouch, const FCPoint& firstPoint, bool secondTouch, const FCPoint& secondPoint);
        /**
         * 更新布局方法
         */
        virtual void update();
        /**
         * 缩小
         */
        virtual void zoomOutChart();
        /**
         * 放大
         */
        virtual void zoomInChart();
    };
}
